#include <stdio.h>  // 标准输入输出库，用于 printf, fflush
#include <stdlib.h> // 标准库 (在此文件中未使用，但通常包含以备不时之需)
#include "console.h" // 对应的头文件，可能包含颜色定义等

// 将光标移动到屏幕的指定位置 (x, y)
// x: 列坐标 (从左到右)
// y: 行坐标 (从上到下)
// 使用 ANSI 转义序列: ESC[y;xH
void cusor_moveto(int x, int y)
{
    // printf 函数用于格式化输出字符串到标准输出 (通常是控制台)。
    // "\033[%d;%dH": 这是一个 ANSI 转义序列字符串。
    //   \033: ESC (Escape) 字符的八进制表示。它是很多终端控制序列的前缀。
    //   [:    控制序列引导符 (Control Sequence Introducer, CSI)。
    //   %d;%dH: 光标定位命令。第一个 %d 会被参数 y (行号) 替换，第二个 %d 会被参数 x (列号) 替换。
    //           H (或者 f) 是设置光标位置的命令。
    // 因此，例如 cusor_moveto(10, 5) 会打印出 "\033[5;10H"，使光标移动到第5行第10列。
    printf("\033[%d;%dH",y,x);
    // fflush(stdout): 刷新标准输出缓冲区。
    // printf 的输出通常会被暂存到缓冲区中，直到缓冲区满、遇到换行符或程序结束时才实际显示。
    // fflush(stdout) 强制将缓冲区中的内容立即发送到输出设备 (控制台)，确保光标移动命令即时生效。
    fflush(stdout);
} 

// 保存当前光标位置
// 使用 ANSI 转义序列: ESC[s
void cusor_get_pos(void)
{
    // ESC[s: 保存当前光标位置的 ANSI 序列。
    printf("\033[s");
    fflush(stdout);   // 确保命令立即生效。
} 

// 恢复之前保存的光标位置
// 使用 ANSI 转义序列: ESC[u
void cusor_set_pos(void)
{
    // ESC[u: 恢复已保存光标位置的 ANSI 序列。
    printf("\033[u");
    fflush(stdout);   // 确保命令立即生效。
} 

// 隐藏光标
// 使用 ANSI 转义序列: ESC[?25l (小写 L)
void cusor_hide(void)
{
	printf("\033[?25l"); // ESC[?25l: 隐藏光标的 ANSI 序列。
	fflush(stdout);      // 确保命令立即生效。
}

// 显示光标
// 使用 ANSI 转义序列: ESC[?25h
void cusor_show(void)
{
    // \033[?25h: 显示光标的 ANSI 序列。
    // 注意：原代码中是 \33，这在某些编译器或终端中可能无法正确解析为 ESC。
    //       标准的八进制表示是 \033，十六进制是 \x1B。
	printf("\033[?25h");
	fflush(stdout);      // 确保命令立即生效。
}

// 清除整个屏幕的内容
// 使用 ANSI 转义序列: ESC[2J
void clear_screen(void)
{
    // ESC[2J: 清除整个屏幕的 ANSI 序列。
    printf("\033[2J");
    fflush(stdout);   // 确保命令立即生效。
}

/*
  ANSI 颜色代码说明 (通常在 console.h 中定义宏):
COLOR_RED              红 (通常是 31)
COLOR_BLACK            黑 (通常是 30)
COLOR_GREEN            绿 (通常是 32)
COLOR_BLUE             蓝 (通常是 34)
COLOR_YELLOW           黄 (通常是 33)
COLOR_WHITE            白 (通常是 37)
COLOR_CYAN             青 (通常是 36)
COLOR_MAGENTA          洋红 (通常是 35)
*/

// 设置控制台输出的前景颜色 (即文字颜色)
// color: 代表颜色的整数值 (例如 31 代表红色)
// 使用 ANSI 转义序列: ESC[#m  (其中 # 是颜色代码)
void set_fg_color(int color)
{
    // ESC[%dm: 设置图形渲染模式的 ANSI 序列。
    // %d 会被参数 color (例如 31) 替换，m 结束该序列。
    // 例如，set_fg_color(31) 会打印 "\033[31m"，使后续文本变为红色。
    printf("\033[%dm",color);
    fflush(stdout); // 确保颜色设置立即生效。
}

// 设置控制台输出的背景颜色
// color: 代表前景颜色的整数值，背景颜色通常是前景颜色值 + 10 (例如 41 代表红色背景)
// 使用 ANSI 转义序列: ESC[#m (其中 # 是背景颜色代码)
void set_bg_color(int color)
{
    // 背景颜色代码通常是对应的前景颜色代码加上10。
    // 例如，前景红是31，背景红是41。
    // ESC[%dm: %d 会被 (color+10) 替换。
    printf("\033[%dm",(color+10));
    fflush(stdout); // 确保颜色设置立即生效。
}